﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Calculator
{
    public partial class Form1 : Form
    {
        string FormOfOperation = null; // Вид операции (плюс, минус, умножить или разделить)
        int iFrstMem, iScndMem = 1; // первый и второй целочисленный члены
        double dFrstMem, dScndMem = 1.0; //первый и второй дробные члены
        bool IsDouble = false; // проверка на целочисленность
        bool DoubleEqualClick = false; //проверка на повторное нажатие =
        bool SecondClick = false; //Повторное нажатие кнопки оператора
        string PreviousOp; // на случай, если после нажатия = продолжается ввод цифр без нажатия Clear
        bool DivisionByZero = false;
        bool FirstOp = true; // Переменная для отслеживания последовательных вычислений
        char c; // Проверк последнего символа на случай повторного нажатия конопки оператора
        string service = ""; //Еще одна служебная переменная для использования в случае повторного нажатия оператора

        public Form1()
        {
            InitializeComponent();
        }

    public void SetSymbol(char a) {
        if (!FirstOp)
        {
            label1.Text = null;
            FirstOp = true;
        }
        DoubleEqualClick = false; //если была нажата цифра, значит повторного нажатия = не будет
        if (label1.Text == null) label1.Text = a.ToString();
        else {
             label1.Text = label1.Text + a.ToString();
             }
   }

   // public void Convesion() {
   //     SecondClick = true;
   ////      if (IsDouble) dFrstMem = Convert.ToDouble(label1.Text);
   ////      else iFrstMem = Convert.ToInt32(label1.Text);
   //////      label1.Text = " "; 
   //     switch(FormOfOperation) {
   //         case "Plus":
   //              label1.Text = label1.Text + '+';
   //              break;
   //     }
   //}

    public void Split(char f, string text)
    {
        string[] parts = text.Split(f);
        if (IsDouble)
        {
            dFrstMem = Convert.ToDouble(parts[0]);
            dScndMem = Convert.ToDouble(parts[1]);
        } else {
            iFrstMem = Convert.ToInt32(parts[0]);
            iScndMem = Convert.ToInt32(parts[1]);
        }
    }

    public void Calculate(string Operation) {
        switch (Operation) {
        case "Plus" :
                if (!DoubleEqualClick) Split('+', label1.Text);
                if (IsDouble) label1.Text = Convert.ToString(dFrstMem + dScndMem);
                else label1.Text = Convert.ToString(iFrstMem + iScndMem);
                break;
        case "Minus" :
                if (!DoubleEqualClick) Split('-', label1.Text);
                if (IsDouble) label1.Text = Convert.ToString(dFrstMem - dScndMem);
                else label1.Text = Convert.ToString(iFrstMem - iScndMem);
                break;
        case "Multiply" :
            if (!DoubleEqualClick) Split('*', label1.Text);
            if (IsDouble) label1.Text = Convert.ToString(dFrstMem * dScndMem);
            else label1.Text = Convert.ToString(iFrstMem * iScndMem);
            break;
        case "Divide" :
            if (!DoubleEqualClick) Split('/', label1.Text);
            if (iScndMem == 0 | dScndMem == 0)
            {
                label1.Text = "Деление на нуль не допустимо";
                DivisionByZero =true;
                break;
            }
            if (IsDouble) label1.Text  = Convert.ToString(dFrstMem / dScndMem);
            else if ((iFrstMem % iScndMem) == 0) label1.Text = Convert.ToString(iFrstMem/iScndMem);
            else { 
                dFrstMem = (double) iFrstMem;
                dScndMem = (double) iScndMem;
                label1.Text = Convert.ToString(dFrstMem/dScndMem); 
                IsDouble = true;
            }
            break;
        }
     }

    private void button11_Click(object sender, EventArgs e)
    {
        SetSymbol((char) '0');
        bool SecondClick = false;
    }

    private void button12_Click(object sender, EventArgs e)
    {
        SetSymbol((char) '1');
        bool SecondClick = false;
    }

    private void button13_Click(object sender, EventArgs e)
    {
        SetSymbol((char) '2');
        bool SecondClick = false;
    }

    private void button8_Click(object sender, EventArgs e)
    {
        SetSymbol((char) '3');
        bool SecondClick = false;
    }

    private void button9_Click(object sender, EventArgs e)
    {
    SetSymbol((char) '4');
    bool SecondClick = false;
    }

    private void button10_Click(object sender, EventArgs e)
    {
        SetSymbol((char) '5');
        bool SecondClick = false;
    }

    private void button16_Click(object sender, EventArgs e)
    {
        SetSymbol((char) '6');
        bool SecondClick = false;
    }

    private void button5_Click(object sender, EventArgs e)
    {
        SetSymbol((char) '7');
        bool SecondClick = false;
    }

    private void button6_Click(object sender, EventArgs e)
    {
        SetSymbol((char) '8');
        bool SecondClick = false;
    }

    private void button7_Click(object sender, EventArgs e)
    {
        SetSymbol((char) '9');
        bool SecondClick = false;
    }

    private void Plus_Click(object sender, EventArgs e)
    {
        if (!SecondClick)
        {
            FormOfOperation = "Plus";
            SecondClick = true;
            label1.Text = label1.Text + '+';
        }
        else if (SecondClick & !Char.IsDigit((char)label1.Text[label1.Text.Length - 1]))
        {
            for (int i = 0; i <= label1.Text.Length - 2; i++) service += label1.Text[i];
            service += '+';
            //Form2 F = new Form2();
            //F.label1.Text = service;
            //F.Show();
            label1.Text = service;
        }
        else
        {
            Calculate(PreviousOp);
            label1.Text = label1.Text + '+';
        }
        PreviousOp = "Plus";
        service = "";
    }

    private void Comma_Click(object sender, EventArgs e)
    {
        SetSymbol((char) ',');
        IsDouble = true;
    }

    private void Minus_Click(object sender, EventArgs e)
    {
        if (!SecondClick)
        {
            FormOfOperation = "Minus";
            SecondClick = true;
            label1.Text += '-';
        }
        else if (SecondClick & !Char.IsDigit((char)label1.Text[label1.Text.Length - 1]))
        {
            for (int i = 0; i <= label1.Text.Length - 2; i++) service += label1.Text[i];
            service += '-';
            //Form2 F = new Form2();
            //F.label1.Text = service;
            //F.Show();
            label1.Text = service;
        }
        else
        {
            Calculate(PreviousOp);
            label1.Text += '-';
        }
        PreviousOp = "Minus";
        service = "";
   //     c = label1.Text[label1.Text.Length-1];
    }

    private void Multiply_Click(object sender, EventArgs e)
    {
        if (!SecondClick)
        {
            FormOfOperation = "Multiply";
            SecondClick = true;
            label1.Text = label1.Text + '*';
        }
        else if (SecondClick & !Char.IsDigit((char)label1.Text[label1.Text.Length - 1]))
        {
            for (int i = 0; i <= label1.Text.Length - 2; i++) service += label1.Text[i];
            service += '*';
            //Form2 F = new Form2();
            //F.label1.Text = service;
            //F.Show();
            label1.Text = service;
        }
        else
        {
            Calculate(PreviousOp);
            label1.Text = label1.Text + '*';
        }
        PreviousOp = "Multiply";
        service = "";
    }

    private void Divide_Click(object sender, EventArgs e)
    {
        if (!SecondClick)
        {
            FormOfOperation = "Divide";
            SecondClick = true;
            label1.Text = label1.Text + '/';
        }
        else if (SecondClick & !Char.IsDigit((char)label1.Text[label1.Text.Length - 1]))
        {
            for (int i = 0; i <= label1.Text.Length - 2; i++) service += label1.Text[i];
            service += '/';
            //Form2 F = new Form2();
            //F.label1.Text = service;
            //F.Show();
            label1.Text = service;
        }
        else
        {
            Calculate(PreviousOp);
            label1.Text = label1.Text + '/';
        }
        PreviousOp = "Divide";
        service = "";
    }

    private void Equal_Click(object sender, EventArgs e)
    {
        FirstOp = false;
        if (DoubleEqualClick){
            if (DivisionByZero) return;
            if (IsDouble) dFrstMem = Convert.ToDouble(label1.Text);
            else iFrstMem = Convert.ToInt32(label1.Text);
            Calculate(FormOfOperation);
        }
       else if (IsDouble & !DoubleEqualClick) {
           if (SecondClick) Calculate(PreviousOp); 
           else Calculate(FormOfOperation);
           DoubleEqualClick =true;
            } 
       
        else if (SecondClick) {
            Calculate(PreviousOp);
            DoubleEqualClick = true;
            }
        SecondClick = false;
    }
    private void Clear_Click(object sender, EventArgs e)
    {
        IsDouble = false;
        iFrstMem = 0; //целочисленное первое значение по умолчанию
        iScndMem = 1; //целочисленное второе значение по умолчанию
        dFrstMem = 0.0; //дробное первое значение по умолчанию
        dScndMem = 1.0; //дробное второе значение по умолчанию
        label1.Text = "";
        DoubleEqualClick = false;
        DivisionByZero = false;
        SecondClick = false;
    }

   }
}